package com.zenithmind.news.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zenithmind.common.result.PageResult;
import com.zenithmind.news.mapper.NewsMapper.NewsStatistics;
import com.zenithmind.news.mapper.NewsMapper.TagStatistics;
import com.zenithmind.news.mapper.NewsMapper.NewsTrend;
import com.zenithmind.news.pojo.dto.NewsCreateDTO;
import com.zenithmind.news.pojo.entity.News;
import com.zenithmind.news.pojo.vo.NewsVO;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 新闻服务接口
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
public interface NewsService extends IService<News> {

    /**
     * 创建新闻
     * 
     * @param createDTO 创建DTO
     * @return 新闻VO
     */
    NewsVO createNews(NewsCreateDTO createDTO);

    /**
     * 分页查询新闻列表
     * 
     * @param current 当前页
     * @param size 页大小
     * @param categoryId 分类ID
     * @param status 新闻状态
     * @param type 新闻类型
     * @param keyword 关键词
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 分页结果
     */
    PageResult<NewsVO> getNewsPage(Long current, Long size, String categoryId, 
                                  Integer status, Integer type, String keyword,
                                  LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 根据ID查询新闻详情
     * 
     * @param id 新闻ID
     * @param userId 用户ID（用于记录行为）
     * @return 新闻VO
     */
    NewsVO getNewsById(String id, String userId);

    /**
     * 更新新闻
     * 
     * @param id 新闻ID
     * @param updateDTO 更新DTO
     * @return 是否成功
     */
    Boolean updateNews(String id, NewsCreateDTO updateDTO);

    /**
     * 删除新闻
     * 
     * @param id 新闻ID
     * @return 是否成功
     */
    Boolean deleteNews(String id);

    /**
     * 发布新闻
     * 
     * @param id 新闻ID
     * @return 是否成功
     */
    Boolean publishNews(String id);

    /**
     * 下架新闻
     *
     * @param id 新闻ID
     * @return 是否成功
     */
    Boolean unpublishNews(String id);

    /**
     * 更新新闻状态
     *
     * @param id 新闻ID
     * @param status 状态
     * @return 是否成功
     */
    Boolean updateNewsStatus(String id, String status);

    /**
     * 审核新闻
     * 
     * @param id 新闻ID
     * @param approved 是否通过
     * @param comment 审核意见
     * @return 是否成功
     */
    Boolean reviewNews(String id, Boolean approved, String comment);

    /**
     * 查询热门新闻
     * 
     * @param limit 限制数量
     * @return 新闻列表
     */
    List<NewsVO> getHotNews(Integer limit);

    /**
     * 查询推荐新闻
     * 
     * @param userId 用户ID
     * @param limit 限制数量
     * @return 新闻列表
     */
    List<NewsVO> getRecommendNews(String userId, Integer limit);

    /**
     * 查询置顶新闻
     * 
     * @param categoryId 分类ID
     * @param limit 限制数量
     * @return 新闻列表
     */
    List<NewsVO> getTopNews(String categoryId, Integer limit);

    /**
     * 查询相关新闻
     * 
     * @param newsId 新闻ID
     * @param limit 限制数量
     * @return 新闻列表
     */
    List<NewsVO> getRelatedNews(String newsId, Integer limit);

    /**
     * 根据标签查询新闻
     * 
     * @param tags 标签列表
     * @param limit 限制数量
     * @return 新闻列表
     */
    List<NewsVO> getNewsByTags(List<String> tags, Integer limit);

    /**
     * 搜索新闻
     * 
     * @param keyword 关键词
     * @param limit 限制数量
     * @return 新闻列表
     */
    List<NewsVO> searchNews(String keyword, Integer limit);

    /**
     * 点赞新闻
     * 
     * @param newsId 新闻ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean likeNews(String newsId, String userId);

    /**
     * 取消点赞新闻
     * 
     * @param newsId 新闻ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean unlikeNews(String newsId, String userId);

    /**
     * 收藏新闻
     * 
     * @param newsId 新闻ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean favoriteNews(String newsId, String userId);

    /**
     * 取消收藏新闻
     * 
     * @param newsId 新闻ID
     * @param userId 用户ID
     * @return 是否成功
     */
    Boolean unfavoriteNews(String newsId, String userId);

    /**
     * 分享新闻
     * 
     * @param newsId 新闻ID
     * @param userId 用户ID
     * @param platform 分享平台
     * @return 是否成功
     */
    Boolean shareNews(String newsId, String userId, String platform);

    /**
     * 更新新闻统计信息
     * 
     * @param newsId 新闻ID
     * @param viewCount 阅读量增量
     * @param likeCount 点赞数增量
     * @param favoriteCount 收藏数增量
     * @param shareCount 分享数增量
     * @param commentCount 评论数增量
     * @return 是否成功
     */
    Boolean updateNewsStatistics(String newsId, Long viewCount, Long likeCount, 
                                Long favoriteCount, Long shareCount, Long commentCount);

    /**
     * 计算新闻热度评分
     * 
     * @param newsId 新闻ID
     * @return 热度评分
     */
    Double calculateHotScore(String newsId);

    /**
     * 批量更新新闻状态
     * 
     * @param newsIds 新闻ID列表
     * @param status 新闻状态
     * @return 是否成功
     */
    Boolean batchUpdateStatus(List<String> newsIds, Integer status);

    /**
     * 获取新闻统计信息
     * 
     * @param categoryId 分类ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @return 统计信息
     */
    NewsStatistics getNewsStatistics(String categoryId, LocalDateTime startTime, LocalDateTime endTime);

    /**
     * 获取热门标签
     * 
     * @param limit 限制数量
     * @return 标签列表
     */
    List<TagStatistics> getHotTags(Integer limit);

    /**
     * 获取新闻趋势
     * 
     * @param days 天数
     * @return 趋势数据
     */
    List<NewsTrend> getNewsTrend(Integer days);

    /**
     * 实时推送新闻
     * 
     * @param news 新闻对象
     * @return 是否成功
     */
    Boolean pushNews(News news);
}
